PHP-mongo-php-library使用

上文地址:https://www.jianshu.com/p/1de642b956f7

接下来,我就按照mongo-php-library这个官方包来给大家演示一遍基本的curd,我附带上原生的mongodb语句,以便大家理解
注明:我用的MongoDB版本为3.4.

shell

打开任意一张表就可以看到这样的界面,在红框内输入原生语句,ctrl+r执行

首先,安装这个包composer require mongodb/mongodb,再加上use MongoDB;,然后就可以开始享用了.
该库的手册地址:https://docs.mongodb.com/php-library/current/tutorial/crud/


连接

//连接本地服务
$client = new MongoDB\Client('mongodb://127.0.0.1:27017');
//选择数据库和集合
$collection = $client->selectCollection('DatebaseName', 'collectionName');
//这个库同时支持mongo拓展的写法.
//$collection = $client->DatebaseName->collectionName;

插入
单条插入 : insertOne方法将单个文档插入到MongoDB中,并返回一个实例,使用getInsertedId可以获取插入文档的id , mongodb会自动生_id字段,为24位随机字符串,同时,用户也可以指定生成
原生语句为db.user.insertOne({'name':'dullcat'})

$user = array('name'=>'Dullcat','sex'=>'male');
//执行并返回实例
$result = $collection->insertOne($user);
//拿到返回的_id
$id= $result->getInsertedId();
//返回值:5af53f89804c044a340018f2 

批量插入:跟mysql的批量原理相同,组装成多维数组.和单条插入的函数相仿insertMany,getInsertedIds
原生语句为db.user.insertMany([{'name':'猫爷'},{'name':'Dullcat'}])

$users = array(array('name'=>'猫爷','sex'=>'male'),array('name'=>'DullCat','sex'=>'male'));
$result = $collection->insertMany($users);
$ids_info= $result->getInsertedIds();
//拿到插入的个数
$count = $result->getInsertedCount();
/**
//返回值:
array(2) {
  [0]=>
  object(MongoDB\BSON\ObjectId)#11 (1) {
    ["oid"]=>
    string(24) "5af548d3804c044a340018f8"
  }
  [1]=>
  object(MongoDB\BSON\ObjectId)#14 (1) {
    ["oid"]=>
    string(24) "5af548d3804c044a340018f9"
  }
}
*/

需要注意的是批量返回的并不是string类型的id了,而是一个非常复杂的结构,如果我们想要以数组形式拿到他的_id,我们可以使用一下函数

foreach($ids_info as $value){
      $ids [] = $value->__toString();
}
/**
//格式为:
array(2) {
  [0]=>
  string(24) "5af54ead804c044a34001920"
  [1]=>
  string(24) "5af54ead804c044a34001921"
}
*/

查询
单个查询:findOne,相当于sql语句的limit 1
原生语句:db.user.findOne({"_id":ObjectId("5af5553f804c044a34001922")})

//由于储存的`_id`字段是一个BSON类型的object,所以要按_id字段来查的话,要先进行类型转换
$mongo_id = new MongoDB\BSON\ObjectId('5af5553f804c044a34001922');
//查询执行
$info = $collection->findOne(array('_id'=>$mongo_id));
//如果没有找到,返回值为null
//返回值是一个对象,这里我们可以将他强制类型转换`$info = (array)$info`
/**
object(MongoDB\Model\BSONDocument)#22 (1) {
  ["storage":"ArrayObject":private]=>
  array(4) {
    ["_id"]=>
    object(MongoDB\BSON\ObjectId)#21 (1) {
      ["oid"]=>
      string(24) "5af5553f804c044a34001922"
    }
    ["name"]=>
    string(5) "suhua"
    ["age"]=>
    int(26)
    ["sex"]=>
    string(3) "男"
  }
}
*/

多个查询:find
多个查询有两个数组参数,第一个是查询的条件,第二个是选项

$info = $collection->find(array('name'=>'DullCat'));
//第一个数组的查询条件要注意下`$gt`这是查询选择器,表示大于
//第二个数组的选项意义为:`skip`跳过0条数据,`limit`查询10条数据,`sort`按age字段正序排序(1为正序,-1为倒序)
$info = $collection->find(array('name'=>'Dullcat',,'age'=>array('$gt'=>'1')),array('skip'=>0,'limit'=>10,'sort'=>array('age'=>1)));
//这时请注意,多个查询返回的是游标(Cursor),需要的进行处理
//您可以用函数转换
$info_array = $info->toArray();
//也可以用foreach迭代该对象
foreach($info as $value){
       $info_array [] = $value;
}

更新
单条更新updateOne 多条更新updateMany
单个更新和多个更新的用法一模一样,但是要注意的是他的操作符和选项

//update方法有三个数组参数
//第一个数组是查询条件
//第二数组是更新操作符,例如下面的`array('$set'=>array('age'=>'23'))`,意义为:更改age字段为23
//第三个数组是选项,可以选择各种参数,例如下面的`array('upsert'=>true)`,意义为当能查询到就进行更改,如果没有查询到就进行新增操作
$result = $collection->updateOne(array('name'=>'DullCat'),array('$set'=>array('age'=>'23')),array('upsert'=>true));
/**
原生语句
db.user.updateOne(
   { "name": "dullcat" },
   {$set: { "age": "123" }},
   { upsert: true }
)
*/

删除
单个删除deleteOne
原生语句:db.users.deleteOne( { name: "DullCat" } )
多个删除deleteMany
原生语句:db.users.deleteMany( { name: "DullCat" } )
单个删除和多个删除的用法一模一样,只是单个删除只删除查询到的第一条数据,而多个删除则删除匹配到的所有数据

//单个删除
$result = $collection->deleteOne(array('name'=>'DullCat'));
//多个删除
$result = $collection->deleteMany(array('name'=>'DullCat'));
//拿到删除数据的条数
 $count = $result->getDeletedCount();

当然,还有很多功能我都没讲到,比如常用的aggregate聚合,这些就留给大家去阅读官方文档吧

参考文档:
查询选择器:https://docs.mongodb.com/manual/reference/operator/query/
更新操作符:https://docs.mongodb.com/manual/reference/operator/update/#update-operators
Aggregation Pipeline:https://docs.mongodb.com/manual/reference/operator/aggregation-pipeline/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容